import * as vscode from 'vscode';

/**
 * 插件激活时被调用
 * @param context VSCode 扩展上下文
 */
export function activate(context: vscode.ExtensionContext) {
    console.log('Inter Script Runner 插件已激活');

    // 注册执行命令
    const disposable = vscode.commands.registerCommand('interScriptRunner.executeInTerminal', () => {
        executeInTerminal();
    });

    context.subscriptions.push(disposable);
}

/**
 * 插件停用时被调用
 */
export function deactivate() {
    console.log('Inter Script Runner 插件已停用');
}

/**
 * 获取当前活动的终端实例
 * @returns 终端实例，如果没有则创建新的终端
 */
function getActiveTerminal(): vscode.Terminal {
    // 获取所有终端
    const terminals = vscode.window.terminals;
    
    if (terminals.length === 0) {
        // 如果没有终端，创建一个新的
        console.log('没有找到活动终端，创建新终端');
        return vscode.window.createTerminal('Script Runner Terminal');
    }
    
    // 尝试获取当前活动的终端
    const activeTerminal = vscode.window.activeTerminal;
    if (activeTerminal) {
        return activeTerminal;
    }
    
    // 如果没有活动终端，返回第一个终端
    return terminals[0];
}

/**
 * 检查当前文件是否在支持的语言列表中
 * @returns 如果支持返回 true，否则返回 false
 */
function isSupportedFile(): boolean {
    const activeEditor = vscode.window.activeTextEditor;
    if (!activeEditor) {
        return false;
    }

    // 获取文件扩展名
    const fileName = activeEditor.document.fileName;
    const fileExtension = fileName.split('.').pop()?.toLowerCase();
    
    if (!fileExtension) {
        return false;
    }

    // 获取用户配置的支持语言
    const config = vscode.workspace.getConfiguration('interScriptRunner');
    const supportedLanguages: { [key: string]: string[] } = config.get('supportedLanguages') || {};

    // 检查扩展名是否在支持的语言中
    for (const language of Object.values(supportedLanguages)) {
        if (language.includes(fileExtension)) {
            return true;
        }
    }

    // 如果没有配置支持的语言，默认支持所有文件
    return Object.keys(supportedLanguages).length === 0;
}

/**
 * 执行代码到终端的主函数
 */
function executeInTerminal(): void {
    // 获取当前活动的编辑器
    const activeEditor = vscode.window.activeTextEditor;
    
    // 检查是否有活动的编辑器
    if (!activeEditor) {
        vscode.window.showWarningMessage('请先打开一个文件');
        return;
    }

    // 检查文件是否被支持
    if (!isSupportedFile()) {
        vscode.window.showWarningMessage('当前文件类型不支持，请在设置中配置支持的语言');
        return;
    }

    let codeToExecute: string = '';
    let shouldMoveCursor = false;

    // 检查是否有选中的文本
    const selection = activeEditor.selection;
    if (!selection.isEmpty) {
        // 如果有选中文本，获取选中的内容
        codeToExecute = activeEditor.document.getText(selection);
        console.log('执行选中的代码:', codeToExecute);
    } else {
        // 如果没有选中文本，获取当前行的内容
        const currentLine = selection.active.line;
        const lineText = activeEditor.document.lineAt(currentLine).text;
        
        // 处理空行
        if (lineText.trim() === '') {
            // 空行只移动光标，不发送到终端
            const newCursorPosition = new vscode.Position(
                currentLine + 1,
                0
            );
            
            // 检查下一行是否存在
            if (newCursorPosition.line < activeEditor.document.lineCount) {
                const newSelection = new vscode.Selection(
                    newCursorPosition,
                    newCursorPosition
                );
                
                // 移动光标到下一行
                activeEditor.selection = newSelection;
                
                // 滚动到新位置
                activeEditor.revealRange(
                    new vscode.Range(newCursorPosition, newCursorPosition),
                    vscode.TextEditorRevealType.InCenterIfOutsideViewport
                );
            }
            return; // 直接返回，不执行任何终端操作
        }
        
        codeToExecute = lineText;
        shouldMoveCursor = true; // 标记需要移动光标到下一行
        
        console.log('执行当前行代码:', codeToExecute);
    }

    // 如果没有代码可执行，直接返回
    if (codeToExecute.trim() === '') {
        return;
    }

    try {
        // 先保存当前编辑器状态，确保我们能重新获得焦点
        const currentEditor = activeEditor;
        const targetLine = selection.active.line;
        
        // 获取活动终端
        const terminal = getActiveTerminal();
        
        // 发送代码到终端并执行（不显示终端，保持焦点在编辑器）
        terminal.sendText(codeToExecute, true);
        
        console.log('代码已发送到终端执行');
        
        // 使用命令来确保焦点返回编辑器
        const ensureFocusInEditor = async () => {
            // 确保焦点在编辑器中
            await vscode.commands.executeCommand('workbench.action.focusActiveEditorGroup');
            
            if (shouldMoveCursor) {
                // 计算新光标位置
                const newCursorPosition = new vscode.Position(
                    targetLine + 1,
                    0
                );
                
                // 检查下一行是否存在
                if (newCursorPosition.line < currentEditor.document.lineCount) {
                    // 设置新的光标位置
                    const newSelection = new vscode.Selection(
                        newCursorPosition,
                        newCursorPosition
                    );
                    currentEditor.selection = newSelection;
                    
                    // 滚动到新位置
                    currentEditor.revealRange(
                        new vscode.Range(newCursorPosition, newCursorPosition),
                        vscode.TextEditorRevealType.InCenterIfOutsideViewport
                    );
                }
            }
        };
        
        // 使用多种方法确保焦点返回
        setTimeout(() => {
            // 方法1：使用命令强制焦点到编辑器
            ensureFocusInEditor();
            
            // 方法2：作为备用，直接显示文档
            setTimeout(() => {
                vscode.window.showTextDocument(currentEditor.document, {
                    viewColumn: currentEditor.viewColumn,
                    preserveFocus: false
                });
            }, 25);
        }, 100);
        
    } catch (error) {
        console.error('执行代码时出错:', error);
        vscode.window.showErrorMessage(`执行代码失败: ${error}`);
    }
}